From 6a95e9ca1c121b827d4d15ec28246505baee7815 Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Thu, 27 Jan 2005 23:42:08 +0000 Subject: [PATCH] bitkeeper revision 1.1159.231.9 (41f97c50Eg32TPmD9lVOyWCldhbhDA) Some guests depend on getting a #GP fault in order to boot. This patch makes sure that the GP fault is injected into the guest properly. Signed-off-by: Arun Sharma Signed-off-by: ian.pratt@cl.cam.ac.uk --- xen/arch/x86/vmx.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index f69002f4ed..194311242b 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -41,6 +41,11 @@ unsigned int opt_vmx_debug_level; extern long evtchn_send(int lport); extern long do_block(void); +#define VECTOR_DB 1 +#define VECTOR_BP 3 +#define VECTOR_GP 13 +#define VECTOR_PG 14 + int start_vmx() { struct vmcs_struct *vmcs; @@ -142,19 +147,26 @@ static int vmx_do_page_fault(unsigned long va, unsigned long error_code) static void vmx_do_general_protection_fault(struct xen_regs *regs) { unsigned long eip, error_code; + unsigned long intr_fields; __vmread(GUEST_EIP, &eip); __vmread(VM_EXIT_INTR_ERROR_CODE, &error_code); - VMX_DBG_LOG(DBG_LEVEL_1, + VMX_DBG_LOG(DBG_LEVEL_1, "vmx_general_protection_fault: eip = %lx, erro_code = %lx\n", eip, error_code); - VMX_DBG_LOG(DBG_LEVEL_1, + VMX_DBG_LOG(DBG_LEVEL_1, "eax=%x, ebx=%x, ecx=%x, edx=%x, esi=%x, edi=%x\n", regs->eax, regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi); - __vmx_bug(regs); + /* Reflect it back into the guest */ + intr_fields = (INTR_INFO_VALID_MASK | + INTR_TYPE_EXCEPTION | + INTR_INFO_DELIEVER_CODE_MASK | + VECTOR_GP); + __vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields); + __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); } static void vmx_vmexit_do_cpuid(unsigned long input, struct xen_regs *regs) @@ -725,11 +737,6 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs) switch (exit_reason) { case EXIT_REASON_EXCEPTION_NMI: { -#define VECTOR_DB 1 -#define VECTOR_BP 3 -#define VECTOR_GP 13 -#define VECTOR_PG 14 - /* * We don't set the software-interrupt exiting (INT n). * (1) We can get an exception (e.g. #PG) in the guest, or -- 2.30.2